package advancedFeatures;

import java.lang.annotation.*;
import java.lang.reflect.*;

/**
 * 注解的基本作用：
 * 1. 编译检查 - 如 @Override
 * 2. 编译时处理 - 如 Lombok 的 @Data
 * 3. 运行时处理 - 如 Spring 的 @Autowired
 */

// 内置注解示例说明
@SuppressWarnings("unused")  // 抑制编译器警告
class InternalAnnotationDemo {
    @Override  // 检查是否正确重写父类方法
    public String toString() {
        return super.toString();
    }
    
    @Deprecated  // 标记已过时的方法
    public void oldMethod() {}
    
    @FunctionalInterface  // 确保接口是函数式接口
    interface TestInterface {
        void test();
    }
}

// 自定义注解示例
@Retention(RetentionPolicy.RUNTIME)  // 注解保留到运行时
@Target({ElementType.TYPE, ElementType.METHOD})  // 注解可以用于类和方法
@Documented  // 注解会被包含在JavaDoc中
@interface MyAnnotation {
    String value() default "默认值";  // 注解属性
    int count() default 0;
}

// 更多注解示例
@Target(ElementType.FIELD)  // 只能用于字段
@Retention(RetentionPolicy.RUNTIME)
@interface FieldAnnotation {
    String description();
    boolean required() default false;
}

class Person {
    @FieldAnnotation(description = "用户名", required = true)
    private String name;
    
    @FieldAnnotation(description = "年龄")
    private int age;

    public Person() {
        this.name = "默认名字";
        this.age = 0;
    }

    @MyAnnotation(value = "打招呼方法", count = 1)
    public void sayHello() {
        System.out.println("你好，我是 " + name);
        System.out.println("我今年 " + age + " 岁");
    }
}

public class AnnotationAndReflection {
    public static void main(String[] args) throws Exception {
        // 演示如何获取和使用注解信息
        Class<?> personClass = Person.class;
        
        // 1. 获取字段上的注解
        Field[] fields = personClass.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(FieldAnnotation.class)) {
                FieldAnnotation annotation = field.getAnnotation(FieldAnnotation.class);
                System.out.println("字段: " + field.getName());
                System.out.println("描述: " + annotation.description());
                System.out.println("是否必需: " + annotation.required());
                System.out.println("-------------------");
            }
        }

        // 2. 获取方法上的注解
        Method sayHelloMethod = personClass.getMethod("sayHello");
        if (sayHelloMethod.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation annotation = sayHelloMethod.getAnnotation(MyAnnotation.class);
            System.out.println("方法注解值: " + annotation.value());
            System.out.println("方法注解count: " + annotation.count());
        }
    }
} 